package com.project.util;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Component
@Aspect//表示该类为一个切面类
public class CutUtil {

    //    第一个*表示方法的任意返回类型
//    com.project.service.. 匹配指定包及子包中的类
//    *.* 表示匹配任何类的任何方法
//    (..) 表示
//    表示 com.project.service 包中所有类，在执行所有方法时，都会调用该方法
    @Before("execution(* com.project.service..*.*(..))")
    public void before() {
        System.out.println("before前置通知");
    }

    @After("execution(* com.project.service..*.*(..))")
    public void after() {
        System.out.println("after后置通知");
    }

    @Around("execution(* com.project.service..*.*(..))")
    public Object around(ProceedingJoinPoint point) {
//        得到目标对象
        Object target = point.getTarget();
        System.out.println("环绕前");
        try {
//            执行目标方法，得到方法执行后的返回值
            Object returnObj = point.proceed();
            System.out.println("环绕后");
            return returnObj;
        } catch (Throwable e) {
            e.printStackTrace();
        }
        return null;
    }

    @AfterThrowing(value = "execution(* com.project.service..*.*(..))", throwing = "e")
    public void throwException(JoinPoint point, Exception e) {
//        得到目标对象
        Object targetObj = point.getTarget();
//        得到执行目标方法的名称
        String methodName = point.getSignature().toString();

        System.out.println("执行" + targetObj.getClass().getSimpleName() + "的" + methodName + "方法，抛出" + e.getClass().getSimpleName() + "异常");
    }
}
